package p10tika;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;

import java.io.*;

public class IndexUitls10 {
    public void index() {
        IndexWriter indexWriter = null;
        try {
            File file = new File("d:/lucene/test.docx");
            Directory directory = FSDirectory.open(new File("d:/lucene/index2"));
            IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
            indexWriter = new IndexWriter(directory, config);
            Document document = new Document();
            //document.add(new Field("content", new FileReader(file)));

            //使用tika 解析文件
            document.add(new Field("content", new Tika().parse(file)));
            indexWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 第一种方式
     */
    public String parseFile(File file) throws IOException, TikaException, SAXException {
        //Parser 下有很多parser 比如html,pdf的等，这个事能自动检查的
        Parser parser=new AutoDetectParser();
        //第一个参数
        InputStream in=new FileInputStream(file);
        //第二个参数这个参数表示解析内容的，所以解析出来的内容会放到这里
        ContentHandler handler=new BodyContentHandler();

        //第三个参数，表示元数据信息，比如xml 就事 conten_type 等
        Metadata metadata=new Metadata();
        //获取文档的metadata 会自动填充到 metada,但是这里我们也可以自己修改，设置
        metadata.set(Metadata.AUTHOR,"zhangshan");

        //第四个参数表示解析器对象
        ParseContext context=new ParseContext();
        context.set(Parser.class,parser);
        parser.parse(in,handler,metadata,context);

        ///
        for(String name:metadata.names()){
            System.out.println(name+": "+metadata.get(name));
        }


        if(in !=null){
            in.close();
        }
        return handler.toString();
    }

    /**
     * 第二种方式更简单，但效率没有第一种好（不明显）
     * @param file
     * @return
     * @throws IOException
     * @throws TikaException
     */
    public String parseFile2(File file) throws IOException, TikaException {
        Tika tika=new Tika();
        //有多个方法，可以传metadata信息
        return tika.parseToString(file);
    }

}
